package main

import (
	"algorithm/barber/shop"
	"fmt"
	"math/rand"
	"os"
	"os/signal"
	"sync/atomic"
	"time"
)

// 有顾客进来，理发师就工作，一个理发师只能服务一个顾客
// 店铺内最多有n个座位，即最多容纳n个顾客
// 多余的顾客只能离开
// 店铺关门时，顾客只能离开，但必须服务完店内的所有顾客才能关门
func main() {
	const maxChairs = 10
	s := shop.Open(maxChairs)

	go func() {
		var id int64
		for {
			time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
			name := fmt.Sprintf("cust-%d", atomic.AddInt64(&id, 1))
			if err := s.EnterCustomer(name); err != nil {
				fmt.Printf("Customer %q told %q\n", name, err)
				if err == shop.ErrShopClosed {
					break
				}
			}
		}
	}()

	// 实现对系统的信号监听
	sigChan := make(chan os.Signal, 1)
	// 监听sigChan通道的中断信号（第二个参数如果不设置则表示监听所有的信号）
	signal.Notify(sigChan, os.Interrupt)
	<-sigChan // 实现终止程序后，关闭s 通道，即barberShop关门
	fmt.Println("Shutting down shop!")
	s.Close()
}
